/**
 * 验证器
 */
package validator

import (
	"regexp"
)

var (
	// 邮箱
	EmailRX = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$")
	// 手机
	PhoneRX = regexp.MustCompile(`^1[3-9]\d{9}$`)
	// 颜色
	ColorHex = regexp.MustCompile("^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$")
)

type Validator struct {
	// 错误信息
	Errors map[string]string
}

/**
 * 创建验证器
 */
func New() *Validator {
	return &Validator{Errors: make(map[string]string)}
}

/**
 * 验证器是否有错误
 */
func (v *Validator) Valid() bool {
	return len(v.Errors) == 0
}

/*
 *添加错误信息
 */
func (v *Validator) AddError(key, message string) {
	if _, exists := v.Errors[key]; !exists {
		v.Errors[key] = message
	}
}

/**
 * 验证
 */
func (v *Validator) Check(ok bool, key, message string) {
	if !ok {
		v.AddError(key, message)
	}
}

/**
 * 验证值是否在给定的列表中
 */
 func PermittedValue[T comparable](value T, permittedValues ...T) bool {
	for _, v := range permittedValues {
		if value == v {
			return true
		}
	}
	return false
}

/**
 * 验证值是否匹配给定的正则表达式
 */
 func Matches(value string, rx *regexp.Regexp) bool {
	return rx.MatchString(value)
}

/**
 * 验证值是否唯一
 */
 func Unique[T comparable](values []T) bool {
	uniqueValues := make(map[T]bool)
	for _, value := range values {
		if uniqueValues[value] {
			return false
		}
		uniqueValues[value] = true
	}
	return true
}